package com.songshuai.webapi.permission.service;

import com.songshuai.webapi.permission.dto.request.DepartmentsUpdateRelationAddReqDto;
import com.songshuai.webapi.permission.dto.response.*;
import com.songshuai.webapi.permission.model.YxDepartments;
import com.songshuai.webapi.permission.model.YxUsers;

import java.util.List;
import java.util.Map;

/**
 * @Author: lhx
 * @Date: 2018/11/8 14:02
 * @Version 1.0
 */
public interface DepartmentsService {

    /**
     * 添加部门
     * @param yxDepartments
     * @return
     */
    Boolean addDepartment(YxDepartments yxDepartments);

    /**
     * 查询所有部门以及子部门
     * @param id 部门id
     * @return
     */
    DepartmentsListResDto queryAllList(Integer id);


    /**
     * 根据部门id获取部门树（该树包含父级以及子集）
     * @param id 部门id
     * @return
     */
    DepartmentsListResDto queryParentList(Integer id);


    /**
     * 修改部门
     * @param request
     * @return
     */
    Boolean updateDepartment(YxDepartments request);

    /**
     * 获取所有部门以及部门员工
     * @param id 部门id
     * @return
     */
    DepartmentAndUserListResDto selectDeptAndUserById(Integer id);

    /**
     * 删除部门以及子部门
     * @param id 部门id
     * @return
     */
    Boolean deleteDepartments(Integer id,Integer userId);

    /**
     * 根据实体查询
     * @param yxDepartments
     * @return
     */
    List<YxDepartments> selectByEntityList(YxDepartments yxDepartments);

    /**
     * 根据部门id和当前用户部门的id  获取子部门集合以及子部门是否有子节点
     * @param id
     * @return
     */
    List<DepartmentChildResDto> selectListAndChildNumById(Integer id, Integer userDepartmentId);


    /**
     * 修改部门层级关系
     * @param request
     * @return
     */
    Boolean updateDepartmentsRelation(DepartmentsUpdateRelationAddReqDto request,Integer userId);

    /**
     * 通过部门id查看本部门成员和直接子部门
     * @param deptId
     * @param roleId
     * @return
     */
    List<Map> selectDepartmentsAndUsersById(Integer userId, Integer deptId, Integer roleId);

    /**
     * 查询指定部门下的子部门(排除不属于当前用户所在部门的父部门树的节点)
     * @param userId
     * @param deptId
     * @return
     */
    List<DepartmentsChildResDto> selectChildDepartments(Integer userId, Integer deptId);

    /**
     * 通过deptIds查询部门信息
     * @param deptIds
     * @return
     */
    List<DepartmentsChildResDto> selectDepartmentInfoByDeptIds(String deptIds);



    /**
     * 根据部门id获取最近的根节点
     * @param id 部门id
     * @return
     */
    DepartmentResDto queryRootParent(Integer id);



    /**
     * 根据用户获取根部门集合
     * @param user
     * @return
     */
    List<DepartmentChildResDto> queryRootParentList(YxUsers user);

    /**
     * 查看指定部门的子部门(需判断查询出的子部门是用户所在部门的父部门)
     * @param deptId
     * @param userId
     * @return
     */
    List<Map> queryParentDepartmentList(Integer userId, Integer deptId);

    /**
     * 查询用户所在部门的顶级父节点
     * @param userId
     * @return
     */
    List<DepartmentsChildResDto> queryTopParentList(Integer userId);


    /**
     * 根据主键查询
     * @param id
     * @return
     */
    DepartmentResDto selectByPrimaryKey(Integer id);

    /**
     * 补全部门关系
     * @return
     */
    Boolean complementDeptRelation();

    /**
     * 根据部门名称查询部门信息
     * @param name
     * @return
     */
    List<DepartmentResDto> queryDeptByName(String name,Integer num);

    /**
     * 根据部门id查询父级部门集合
     * @param id
     * @return
     */
    List<DepartmentResDto> queryParentDeptById(Integer id);
}
